package pe.com.cotelasa.scp.dao.impl;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import org.hibernate.Hibernate;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.Restrictions;
import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import pe.com.cotelasa.common.dao.DaoImpl;
import pe.com.cotelasa.common.dao.excepcion.DAOException;
import pe.com.cotelasa.scp.dao.IDAOCliente;
import pe.com.cotelasa.scp.dominio.common.ESTADO_REGISTRO;
import pe.com.cotelasa.scp.entidad.Cliente;
import pe.com.cotelasa.scp.entidad.VentaFacturacion;

@Repository("daoCliente")
public class DAOClienteImpl extends DaoImpl<Cliente,Integer> implements IDAOCliente,Serializable{
    
    @Autowired
    private SessionFactory sessionFactory;
    
    @Transactional
    public Cliente obtenerEntidadConUbigeo(Integer id) throws DAOException {
        try {
            Cliente ent = (Cliente) sessionFactory.getCurrentSession().createCriteria(Cliente.class).add(Restrictions.idEq(id)).uniqueResult();
            Hibernate.initialize(ent.getIdUbigeo());
            return ent;
        } catch (Exception e) {
            throw new DAOException(e.getMessage(), e);
        }
    }
    
    @Override
    public Cliente validarRuc(String ruc) throws DAOException {
        Cliente clienteBuscado = null;
        try {
            clienteBuscado = (Cliente) sessionFactory.getCurrentSession().createCriteria(Cliente.class)
                    .add(Restrictions.eq("numeroDocumento", ruc))
                    .add(Restrictions.eq("estadoRegistro", ESTADO_REGISTRO.ACTIVO.getValor()))
                    .uniqueResult();
        } catch (Exception e) {
            throw new DAOException(e.getMessage(), e);
        }
        return clienteBuscado;
    }

    @Override
    public Cliente validarRazonSocial(String razonSocial) throws DAOException {
        Cliente clienteBuscado = null;
        try {
            clienteBuscado = (Cliente) sessionFactory.getCurrentSession().createCriteria(Cliente.class)
                    .add(Restrictions.eq("razonSocial", razonSocial))
                    .add(Restrictions.eq("estadoRegistro", ESTADO_REGISTRO.ACTIVO.getValor()))
                    .uniqueResult();
        } catch (Exception e) {
            throw new DAOException(e.getMessage(), e);
        }
        return clienteBuscado;
    }
    
    @Override
    public Cliente validarCodigo(String codigoCliente) throws DAOException {
        Cliente clienteBuscado = null;
        try {
            clienteBuscado = (Cliente) sessionFactory.getCurrentSession().createCriteria(Cliente.class)
                    .add(Restrictions.eq("codigoCliente", codigoCliente))
                    .add(Restrictions.eq("estadoRegistro", ESTADO_REGISTRO.ACTIVO.getValor()))
                    .uniqueResult();
        } catch (Exception e) {
            throw new DAOException(e.getMessage(), e);
        }
        return clienteBuscado;
    }

    @Override
    public List<Cliente> listarClientesTipo(int tipo) throws DAOException {
        List<Cliente> listaClientes = new ArrayList<Cliente>();
        try {
            listaClientes = sessionFactory.getCurrentSession().createCriteria(Cliente.class)
                    .add(Restrictions.eq("tipoCliente", String.valueOf(tipo).charAt(0))).list();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return listaClientes;
    }

}
